#!/usr/bin/env python

"""Unpack a MIME message into a directory of files."""

import os
import sys
import email
import errno
import mimetypes

from optparse import OptionParser


def main():
	parser = OptionParser(usage="""\
Unpack a MIME message into a directory of files.

Usage: %prog [options] msgfile
""")
	parser.add_option('-d', '--directory',
					  type='string', action='store',
					  help="""Unpack the MIME message into the named
					  directory, which will be created if it doesn't already
					  exist.""")
	opts, args = parser.parse_args()
	if not opts.directory:
		parser.print_help()
		sys.exit(1)

	try:
		msgfile = args[0]
	except IndexError:
		parser.print_help()
		sys.exit(1)

	try:
		os.mkdir(opts.directory)
	except OSError as e:
		# Ignore directory exists error
		if e.errno != errno.EEXIST:
			raise

	fp = open(msgfile)
	msg = email.message_from_file(fp)
	fp.close()

	counter = 1
	for part in msg.walk():
		# multipart/* are just containers
		if part.get_content_maintype() == 'multipart':
			continue
		# Applications should really sanitize the given filename so that an
		# email message can't be used to overwrite important files
		filename = part.get_filename()
		if not filename:
			ext = mimetypes.guess_extension(part.get_content_type())
			if not ext:
				# Use a generic bag-of-bits extension
				ext = '.bin'
			filename = 'part-%03d%s' % (counter, ext)
		counter += 1
		fp = open(os.path.join(opts.directory, filename), 'wb')
		fp.write(part.get_payload(decode=True))
		fp.close()


if __name__ == '__main__':
	main()
